package com.example.myspringboot.web.sch;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * @author cy
 * @date 2024/6/5
 */
@RestController
@RequestMapping("/sch")
@RequiredArgsConstructor
@Slf4j
public class ScheduledController {

    /**
     * 定时任务调度接口。
     * 通过POST请求调用此接口，以安排多个定时任务。
     *
     * @param info 传递给定时任务的信息，本例中未使用。
     * @return 返回一个空字符串的HTTP响应。
     */
    @RequestMapping(value = "/dingshi", method = RequestMethod.POST)
    public ResponseEntity<String> schedule(@RequestBody String info) {
        // 创建一个定时任务执行服务，用于管理定时任务。
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);

        // 定义第一个定时任务，每隔一段时间打印信息。
        Runnable task = () -> {
            System.out.println("1定时任务执行中...");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };

        // 定义第二个定时任务，功能同上。
        Runnable task2 = () -> {
            System.out.println("2定时任务执行中...");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };

        // 定义第三个定时任务，功能同上。
        Runnable task3 = () -> {
            System.out.println("3定时任务执行中...");
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };

        // 将第一个任务安排为固定延迟执行，初始延迟0毫秒，之后每隔200毫秒执行一次。
        // 延迟5秒后首次执行，之后每隔2秒执行一次
        executorService.scheduleAtFixedRate(task, 0, 200, TimeUnit.MILLISECONDS);

        // 同上，安排第二个任务。
        executorService.scheduleAtFixedRate(task2, 0, 200, TimeUnit.MILLISECONDS);

        // 同上，安排第三个任务。
        executorService.scheduleAtFixedRate(task3, 0, 200, TimeUnit.MILLISECONDS);

        // 返回HTTP响应，表示请求处理完成。
        return ResponseEntity.ok("");
    }

}
